package fr.enssat.embeddedsoft.projet.fgourvel.spotrin.bluetooth;

import java.util.Set;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import fr.enssat.embeddedsoft.projet.fgourvel.spotrin.R;


/***********************************************************
* BluetoothActivity : 
*	  - Affichage des périphériques 
*	  - gestion du menu d'options
*	  - gestion de lancement de la visibilité
*	  - gestion de recherche de nouveaux périphériques
* 
 ***********************************************************/



public class BluetoothActivity extends Activity {
        
    // temps max de découverte
    private static int DISCOVERABLE_TIME = 300;
    
    // Identifiant du bouton requete
    private final static int REQUEST_ENABLE_BT = 1;
    
    
    // ajout d'un tag pour le debug
    private static String TAG = "BluetoothActivity";
        
    //déclaration d'un service et de l'adaptateur
    private BluetoothService bluetoothService = null;
    private BluetoothAdapter bluetoothAdapter;
    
    //déclaration de l'ArrayAdapter utilisé pour le ListView de la vue des périphérique
    private ArrayAdapter<String> devicesAdapter;
    
    
    
    /*********************************************************
    /*         CREATION D'UN BRODCASTER
     *              --> ajout des périphériques trouvés  
     *********************************************************/
    
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        	String action = intent.getAction();
        	
            // Si il s'agit d'un nouveau périphérique
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            	
                // On récupère le périphérique 
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                
                // Si c'est on ne le connait pas déjà on l'ajoute
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                        devicesAdapter.add(device.getName() + "\n" + device.getAddress());
                }
            } 
        }
    };

    
    /*********************************************************
    /*         CREATION DE L'ACTIVITE 
     *********************************************************/    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.device_list);

            // Récupération de la vue ListView et attribution du ArrayAdapter
            devicesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
            ListView peripheriques = (ListView)findViewById(R.id.new_devices);
            peripheriques.setAdapter(devicesAdapter);
            
            
            
            
            // Ajout d'un écouteur sur le click d'un périphérique de la liste
            peripheriques.setOnItemClickListener(
            		
            	new OnItemClickListener() {
            	
                    public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
                    	
		                // Stop la découverte des périphériques
		                bluetoothAdapter.cancelDiscovery();
		                
		                // Récupère l'adresse MAC du périphérique
		                String infos = ((TextView) v).getText().toString();
		                String adresse = infos.substring(infos.length() - 17);
		                
		                // On récupère le périphérique
		                BluetoothDevice device = bluetoothAdapter.getRemoteDevice(adresse);
		                
		                // Connection au périphérique
		                bluetoothService.connect(device);    
		                
		             
		              // LIGNES DE LANCEMENT DU JEU A AJOUTER! 
		                //  ...
		                
                    }
            	}
        );
            
            
                
	        // Déclaration d'un filtre : 
                            // -- Enregistre les périphériques découverts
            				// -- action lorsque la decouverte est terminee
	        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
	        registerReceiver(receiver, filter);
	        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
	        registerReceiver(receiver, filter);
	        
	        // On récupère les périphériques connus du terminal
	        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();      
	        Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
	        
	        
	        // Ajout de chaque périphérique à l'ArrayAdapter de la listView
	        if (devices.size() > 0) {
	                
	            for (BluetoothDevice device : devices) {
	                devicesAdapter.add(device.getName() + "\n" + device.getAddress());
	            }
	        }
        }
        
    
    /*********************************************************
    /*         LANCEMENT DE L'ACTIVITE 
     *********************************************************/   
    
    @Override
    public void onStart() {
        super.onStart();
        
        //si le bluetooth est déjà lancé, on récupère l'instance du service
        if (bluetoothAdapter.isEnabled()) {
            if (bluetoothService == null) {         
                bluetoothService = BluetoothService.getInstance(this);
            }
        }
        
      //sinon, on active le bluetooth du terminal puis on lance le service
        else{
        	
        	    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        	    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        	    bluetoothService = BluetoothService.getInstance(this);
        }
    }
 
    /*********************************************************
    /*         REPRISE DE L'ACTIVITE 
     *********************************************************/   
    
    @Override
    public synchronized void onResume() {
        super.onResume();
        if(bluetoothService != null){           
            if (bluetoothService.getState() == BluetoothService.ETAT_NUL) {                
                bluetoothService.start();  // lancement du service Bluetooth
            }
        }
    }

    /*********************************************************
    /*         FIN DE L'ACTIVITE 
     *********************************************************/   
    
        @Override
    protected void onDestroy() {
        super.onDestroy();
        // Si le service a été instancié
        if (bluetoothService != null){
                // On arrête le service
                bluetoothService.stop();
        }
        // Si l'adapter a été instancié
        if (bluetoothAdapter != null) {
                // On arrête la découverte
                bluetoothAdapter.cancelDiscovery();
        }
        // Désinscription du receiver
        unregisterReceiver(receiver);
    }
        
        /*********************************************************
        /*        GESITON DU MENU d'OPTIONS
         *********************************************************/  
        
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Ajout du menu d'option
        MenuInflater inflater = getMenuInflater();
        
        inflater.inflate(R.menu.option_menu, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Selon l'id de l'item du menu sélectionné
        switch (item.getItemId()) {
        
        		
                case R.id.recherche:
                        
                        // Si on est en train d'effectuer une recherche
                    if (bluetoothAdapter.isDiscovering()) {
                        // On arrête la découverte
                        bluetoothAdapter.cancelDiscovery();
                    }
                    // On lance la découverte des périphériques
                    bluetoothAdapter.startDiscovery();
                    return true;
                      
                
                case R.id.visible:
               
                	//si le mode découverte est désactivé
                    if (bluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
                    	
                        // Demande à l'utilisateur l'autorisation pour rendre visible le terminal
                        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVERABLE_TIME);
                        startActivity(intent);
                    }
                    //mise en mode serveur pour attendre une connexion
                    bluetoothService.start();
                    
                    return true;
        }
        return false;
    }

}
